package com.efuture.chaptersix

/* @Description: Kotlin语言范型函数学习
 * @Auther: zhaoshanshan
 * @Date: 2022/03/07/9:16 下午
 */

class Demo97<T>(private val isR:Boolean, private val obj:T){
  fun getObj()=obj.takeIf {isR}//takeIf 表达式为true 则返回 obj 否则返回null
}

data class Demo97Test1(val name:String,val age:Int,val sex:Char);
data class Demo97Test2(val name:String,val age:Int,val sex:Char);

fun main() {

    println(Demo97(true,Demo97Test1("赵山山",30,'男')).getObj())
    println(Demo97(true,Demo97Test2("方样样",29,'女')).getObj())
    println(Demo97(false,Demo97Test1("赵山山",30,'男')).getObj())
    println(Demo97(false,Demo97Test2("方样样",29,'女')).getObj())
    println()
    //使用run函数 匿名内部持有this对象 最后一行返回值决定返回类型
     Demo97(true,Demo97Test1("赵山山",30,'男')).getObj()?.run {
        println("万能对象$this")
    }?: println("获取到到对象为空")
    println()
    //使用apply函数 apply函数匿名内部持有this对象 返回值返回的是调用者本身
    val r1 = Demo97(true,Demo97Test1("赵山山",30,'男')).getObj()?.apply {
        println("apply方式获取到的万能对象$this")
    }?:println("apply方式获取到的万能对象为空")
    println("r1:$r1")
    println()
    show(Demo97Test2("方样样",29,'女'))
    show(null)
}
fun <T> show(item:T){
    var r1 = item?.also {
        //内部持有it ==item
        println("also方式获取到万能对象为$it")
    }?: println("also方式获取到万能对象为空")
    println("also方式:$r1")
}
    